package venta;

import cliente.Cliente;

import org.joda.time.DateTime;

import exceptions.ErrorEdo;
import exceptions.ErrorFechaDeEnvio;
import exceptions.ErrorSaldo;
import exceptions.ErrorSinStock;

public class VtaConEnvio extends Venta{

	private EstadoDeEnvio estadoDeEnvio;
	private double montoAbonado;
	protected DateTime fechaDeEnvio;

	VtaConEnvio(Cliente unCliente){
		this.asignarCliente(unCliente);
		EstadoDeEnvio unEstado = new EdoPendiente(this);
		this.setEstadoDeEnvio(unEstado);
		this.setMontoAbonado(0);
	}
	
	protected void setMontoAbonado(double unMonto) {
		// TODO Auto-generated method stub
		this.montoAbonado=unMonto;
	}

	protected void setEstadoDeEnvio(EstadoDeEnvio unEstado) {
		// TODO Auto-generated method stub
		this.estadoDeEnvio=unEstado;
	}

	

	public EstadoDeEnvio getEstadoDeEnvio() {
		// TODO Auto-generated method stub
		return this.estadoDeEnvio;
	}
	
	
	
	public double montoRestante(){
		return this.importeTotalDeVenta()-this.getMontoAbonado();
	}

	private double getMontoAbonado() {
		// TODO Auto-generated method stub
		return this.montoAbonado;
	}
	
	public void abonar(double unMonto){
		try {
			this.getEstadoDeEnvio().abonar(unMonto);;
		} catch (ErrorEdo e) {
			// TODO Auto-generated catch block
			e.getMessage();
		} catch (ErrorSaldo e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void abonarMontoRestante(){
		try {
			this.getEstadoDeEnvio().abonarMontoRestante();
		} catch (ErrorEdo e) {
			// TODO Auto-generated catch block
			e.getMessage();
		} catch (ErrorSaldo e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void procesar(){
		try{
			this.getEstadoDeEnvio().procesar();
		} catch (ErrorEdo e){
			e.getMessage();
		} catch (ErrorFechaDeEnvio e){
			
		} catch (ErrorSinStock e){
			
		}
		
	}

	public DateTime getFechaDeEnvio() {
		return fechaDeEnvio;
	}

	public void setFechaDeEnvio(DateTime fechaDeEnvio) {
		try {
			this.getEstadoDeEnvio().setFechaDeEnvio(fechaDeEnvio);
		} catch (ErrorEdo e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Override
	public void confirmarVenta(){
		finalizar();
	}
	public void finalizar(){
		try {
			this.getEstadoDeEnvio().finalizar();
		} catch (ErrorEdo e) {
			// TODO Auto-generated catch block
			e.getMessage();
		} catch (ErrorSaldo e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void reprogramar(){
		try {
			this.getEstadoDeEnvio().reprogramar();
		} catch (ErrorEdo e) {
			// TODO Auto-generated catch block
			e.getMessage();
		}
	}

	public void cancelar(){
		//si el estado es enProceso no deberia poder cancelar
		
		//Pordria pasar a estado reprogramado y cancelar.
		
		//(falta retornar los productos)
		if (this.getEstadoDeEnvio().enProceso()){
			this.retornarProductos();
		}
		
		super.cancelacionTotalNotaDeCredito();
		EstadoDeEnvio unEstado = new EdoCancelado(this);
		this.setEstadoDeEnvio(unEstado);
		
	}
	
	public boolean pendiente() {
		// TODO Auto-generated method stub
		return getEstadoDeEnvio().pendiente();
	}

	public boolean finalizado() {
		// TODO Auto-generated method stub
		return getEstadoDeEnvio().finalizado();
	}

	public boolean enProseso() {
		// TODO Auto-generated method stub
		return getEstadoDeEnvio().enProceso();
	}

	public boolean cancelado() {
		// TODO Auto-generated method stub
		return getEstadoDeEnvio().cancelado();
	}
	
	public boolean reprogramado() {
		return getEstadoDeEnvio().reprogramado();
	}
}
